package org.common.utils.event.factory;
import org.common.utils.event.exception.EventEasyException;
import org.common.utils.event.exception.EventEasyInvokeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Constructor;

/**
 * 默认的事件工厂，默认使用反射创建对象，和直接抛出异常实现。
 * @author zhouzhibing
 * @date 2025/2/26
 */
public class DefaultEventFactory implements EventFactory {

    private static final Logger log = LoggerFactory.getLogger(DefaultEventFactory.class);

    @Override
    public Object newInstance(Class<?> clzss) throws Exception {
        Constructor<?> defaultConstructor = getDefaultConstructor(clzss);
        if(defaultConstructor == null) {
            throw new EventEasyException("EventFactory.newInstance : " + clzss.getName() + " has no default constructor");
        }
        return defaultConstructor.newInstance();
    }

    @Override
    public void exceptionHandler(EventEasyException e) {
        if(e instanceof EventEasyInvokeException e1) {
            log.error("eventAddress = {} , eventClass = {}" , e1.getEventAddress() , e1.getEventClass(), e1);
        } else {
            log.error(e.getMessage(), e);
        }
    }

    /**
     * 根据指定类型，获取默认空构建函数
     * @param clzss 指定类型
     * @return 默认空构建函数
     */
    private Constructor<?> getDefaultConstructor(Class<?> clzss) {
        for (Constructor<?> constructor : clzss.getConstructors()) {
            //存在默认构建函数
            if(constructor.getParameterCount() == 0) {
                return constructor;
            }
        }
        return null;
    }
}
